package com.server.rule.component;



import java.util.List;

import org.jdom.Element;

import com.server.rule.data.Data;

import com.server.rule.data.ExceptionTypeData;

/**
 * Classe abstraite correspondant à un element de l'arbre de décision
 * @author queyroi
 *
 */
public abstract class RuleComponent {
	
	protected String label;
	
	public RuleComponent() {
		label="NoLabel";
	}
	/**
	 * Methode permettant le parcours recursif de l'arbre jusqu'a ce qu'une {@link RuleDecision} soit atteinte
	 * @param data
	 * @param handler Un conteneur de decision permettant de recupérer un decision
	 * @throws ExceptionTypeData
	 */
	public abstract void operate(Data data,DecisionHandler handler) throws ExceptionTypeData;
	
	/**
	 * Methode permettant la creation recursive d'un document XML représentant le système
	 * @return
	 */
	public abstract Element getXMLElement();
	
	
	/**
	 * Test si le système dispose bien d'une {@link RuleDecision} au bout de chaque branche
	 * @return 
	 */
	public abstract boolean hasDecision();
	
	/**
	 * Methode récursive permettant de générer le système à partir d'un {@link Element} xml.
	 * @param xmlElement
	 */
	public abstract void generateFromXML(Element xmlElement);
	
	/**
	 * Methode récursive récupérant les donnes utilisé dans tout le système
	 * @param listeUsedVar
	 */
	public abstract void getUsedVar(List<String> listeUsedVar);

	/**
	 * @param label the label to set
	 */
	public void setLabel(String label) {
		this.label = label;
	}

	/**
	 * @return the label
	 */
	public String getLabel() {
		return label;
	}
	
}
